#include <iostream>
#include <string>
#include <unistd.h>
#include <fcntl.h>

void SetNonBlock(int fd)
{
	int n = fcntl(fd, F_GETFL); // 获取文件描述符的属性
	if (n < 0)
	{
		perror("fcntl");
		return;
	}
	fcntl(fd, F_SETFL, n | O_NONBLOCK); // 设置非阻塞
}

int main()
{
	SetNonBlock(0); // 设置标准输入为非阻塞
	std::string s = "please enter# ";
	char buffer[1024];
	while (true)
	{
		write(0, s.c_str(), s.size());
		// 非阻塞，如果我们不做输入，数据不就绪，以出错形式返回！！
		// read不是有读取失败(-1)吗？失败vs底层数据没就绪 -> 底层数据没就绪，不算失败
		// 如果是-1， 失败vs底层数据没就绪我们后续的做法是不同的！
		// read->-1,失败vs底层数据没就绪->需要区分的必要性的！
		// errno表示：更详细的出错原因,最近一次调用，出错的时候的出错码
		int n = read(0, buffer, sizeof(buffer));
		if (n == 0) // 说明读到文件结尾
		{
			std::cout << "read file end!" << std::endl;
			break;
		}
		else if (n > 0) // 读到数据
		{
			buffer[n] = 0;
			std::cout << "echo# " << buffer << std::endl;
		}
		else
		{
			// EAGAIN		11	/* Try again */ 
			// EWOULDBLOCK	EAGAIN	/* Operation would block */
			if (errno == EAGAIN || errno == EWOULDBLOCK) // 读不到数据，但是可以再试一次
			{
				// 做其他事情呢？

				std::cout << "底层数据，没有就绪" << std::endl;
				sleep(1);

				continue;
			}
			else if (errno == EINTR) // 被信号中断
			{
				std::cout << "被中断,从新来" << std::endl;
				sleep(1);

				continue;
			}
			else // 其他错误
			{
				std::cout << "read error: " << n << ", errno: " << errno << std::endl;
			}
		}
	}
	return 0;
}